#!/usr/bin/env python
#-*- coding:utf-8 -*-

"""
    PySeq0 - a python sequencer
    (c) by Tobias Sauer 2011
    Copyright: GPL v2 only
    http://leichtdio.de
    tobias@leichtdio.de
    
    Google Code:
    http://pyseq0.leichtdio.de
"""

from midi import MidiNote

class Note:
    """
        Verwaltet die Noten
    """
    def __init__(self, noteid, velocity, channel, duration):
        self.noteid = noteid
        self.velocity = velocity
        self.channel = channel
        self.duration = duration

    def return_noteon(self):
        return self.noteid, self.velocity, self.channel

    def return_noteoff(self):
        return self.noteid, self.channel

class Patt:
    """
       Meta-Funktion
       Verwaltet die Noten für einen Loop
    """
    def __init__(self, notes, midipointer, name=None):
        self.name = name # Nur bei Drum nötig!
        self.notes = []
        self.midi = midipointer
        for notetuple in notes:
            if type(notetuple[0]) == int:
                self.notes.append(Note(notetuple[0], notetuple[1],
                                       notetuple[2], notetuple[3]))
            elif notetuple[0] == "sleep":
                self.notes.append(Note("sleep", -1, -1, notetuple[1]))
            else:
                notenwert, oktave = notetuple[0].split(".")
                oktave = int(oktave)
                self.notes.append(Note(MidiNote().get_midi_nr(notenwert, oktave),
                                  notetuple[1], notetuple[2], notetuple[3]))
        self.pointer = 0
        self.stop = False

    def get_name(self):
        return self.name

    def stop_loop(self):
        self.stop = True

    def getnotes(self):
        return self.notes
    
#    def playnote(self):
#        self.pointer += 1
#        if self.pointer >= len(self.notes)+1:
#            self.pointer = 1
#        if self.pointer == 1 and self.stop:
            # Wenn Stop gesetzt und der Pointer wieder auf 1 steht
            # => heißt der Loop wieder von vorne anfangen würde
            # gibt diese Funktion ein False zurück, was dem Programm
            # signalisiert, dass es nicht mehr spielen soll
            # und setzt self.stop wieder auf False
#            self.stop = False
#            self.pointer = 0
#            return False
#        return (self.notes[self.pointer-1].return_noteon(),
#                self.notes[self.pointer-1].duration)

    def stopnote(self):
        return self.notes[self.pointer-1].return_noteoff()


if __name__ == "__main__":
    pass
